import java.util.Arrays;

/**
 * Created whit IntelliJ IDEA.
 * Description：
 * User：ZHONGCHEN
 * Date:2022-02-11
 * Time:12:14
 */
/**1984. 学生分数的最小差值
 * 给你一个 下标从 0 开始 的整数数组 nums ，其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。
 *
 * 从数组中选出任意 k 名学生的分数，使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。
 *
 * 返回可能的 最小差值 。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/minimum-difference-between-highest-and-lowest-of-k-scores
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * 要想最小化选择的 kk 名学生中最高分和最低分的差值，我们一定是在排好序后的数组中连续地进行选择。这是因为在选择时，如果跳过了某个下标 ii，那么在选择完毕后，将其中的最高分替换成 \textit{nums}[i]nums[i]，最高分一定不会变大，与最低分的差值同样也不会变大。因此，一定存在有一种最优的选择方案，是连续选择了有序数组中的 kk 个连续的元素。
 *
 * 这样一来，我们首先对数组 \textit{nums}nums 进行升序排序，随后使用一个大小固定为 kk 的滑动窗口在 \textit{nums}nums 上进行遍历。记滑动窗口的左边界为 ii，那么右边界即为 i+k-1i+k−1，窗口中的 kk 名学生最高分和最低分的差值即为 \textit{nums}[i+k-1] - \textit{nums}[i]nums[i+k−1]−nums[i]。
 *
 * 最终的答案即为所有 \textit{nums}[i+k-1] - \textit{nums}[i]nums[i+k−1]−nums[i] 中的最小值。
 *
 * */
public class TestDemo {
    public int minimumDifference(int[] nums, int k) {
        //先将数组进行排序;然后进行滑窗求值
        Arrays.sort(nums);
        //因为求的是最小值,所以这里要设成int的最大值
        int ans = Integer.MAX_VALUE;
        //设置窗口大小
        for (int i = 0; i + k - 1< nums.length; i++) {
            ans = Math.min(ans , nums[i+k-1] - nums[i]);
        }
        return ans;
    }
}
